Make selectors with no explicit state from higher priority GtkStyleProviders override...
authorCarlos Garnacho <carlosg@gnome.org>
Mon, 17 Jan 2011 03:06:57 +0000 (04:06 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Mon, 17 Jan 2011 03:44:29 +0000 (04:44 +0100)
This makes overriding information from the themes more intuitive

gtk/gtkstyleproperties.c

index 5dc088f29ee8d8e8e0121483a50d285a7397eb0c..0052257cbe939edf7e8eb6cf290ccb42160a78fc 100644 (file)
@@ -186,7 +186,7 @@ property_data_new (void)
 }
 
 static void
-property_data_free (PropertyData *data)
+property_data_remove_values (PropertyData *data)
 {
   guint i;
 
@@ -200,6 +200,14 @@ property_data_free (PropertyData *data)
         g_value_unset (&value_data->value);
     }
 
+  if (data->values->len > 0)
+    g_array_remove_range (data->values, 0, data->values->len);
+}
+
+static void
+property_data_free (PropertyData *data)
+{
+  property_data_remove_values (data);
   g_array_free (data->values, TRUE);
   g_slice_free (PropertyData, data);
 }
@@ -1203,6 +1211,16 @@ gtk_style_properties_merge (GtkStyleProperties       *props,
           GValue *value;
 
           data = &g_array_index (prop_to_merge->values, ValueData, i);
+
+          if (replace && data->state == GTK_STATE_FLAG_NORMAL &&
+              G_VALUE_TYPE (&data->value) != PANGO_TYPE_FONT_DESCRIPTION)
+            {
+              /* Let normal state override all states
+               * previously set in the original set
+               */
+              property_data_remove_values (prop);
+            }
+
           value = property_data_get_value (prop, data->state);
 
           if (G_VALUE_TYPE (&data->value) == PANGO_TYPE_FONT_DESCRIPTION &&